package com.zkh.myframe.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 异步接口注解，使用该注解后，请求某个方法，将返回以下格式的JSON数据：
 * <pre>
 * 	{
 * 		"asyncId": "{asyncId}",
 * 		"data": {data},
 * 		"complete": {complete},
 * 		"errorMessage": "{errorMessage}"
 *  }
 * </pre>
 *  其中：
 *  <li>{asyncId}：用来标识某次请求，非首次请求时，直接传该参数即可。</li>
 *  <li>{data}：原方法响应数据。当complete为1且原方法有返回值时，该字段有值。</li>
 *  <li>{complete}：计算结束标识，int类型，其值有：<pre>
 *  	-1：asyncId无效或缓存失效，需要重新请求接口；
 *  	0 ：计算中，还需要等待；
 *  	1 ：计算完成，可以取数据了；
 *  	2 ：验证器校验失败；
 *  	3 ：计算失败抛出异常。</pre></li>
 *  <li>{errorMessage}：异常信息，当complete值为2或3时，有值。</li>
 *  <pre>
 *      在首次请求拿到asyncId后，后续只需要使用asyncId来获取结果即可（支持参数stayCache，值为“1”时，拿到值后不立即清除缓存，等缓存
 *  自动失效）。请求参数类型支持普通格式和JSON格式。示例如下：
 *  1、普通格式：
 *  	asyncId=具体asyncId值&stayCache=1
 *  2、JSON格式：
 *  	{
 *  		"asyncId": "具体asyncId值",
 *  		"stayCache": "1"
 *  	}
 *  </pre>
 *  <p>注：异步调用内部使用的缓存，使用CacheManager管理，因此支持切换为外部缓存（如：radius）。</p>
 *  
 *  @author zkh
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Async {
	/**
	 * 缓存时间，单位：分钟，默认60分，即1小时。<br />
	 * 即从第1次请求开始，数据缓存的时间。一旦超过缓存时间，通过asyncId获取缓存时，complete计为-1
	 */
	int cacheTime() default 60;
}
